// @author caoshi
// @date 2022/12/1 15:11
// @since 1.0
// 结构体指针的使用
// 结构体是值类型的

package main

import "fmt"

type Person struct {
	name    string
	age     int
	sex     string
	address string
}

func main() {

	p1 := Person{
		name:    "张三",
		age:     18,
		sex:     "男",
		address: "武汉",
	}
	fmt.Println(p1)
	fmt.Printf("%p,%T\n", &p1, p1) // 0xc000020080,main.Person

	// 1. 结构体是值类型的
	p2 := p1 // 值传递
	p2.name = "李四"
	p2.age = 29
	p2.sex = "女"
	p2.address = "北京"
	fmt.Println(p1)
	fmt.Println(p2)

	// 2. 定义结构体指针
	var pp1 *Person
	pp1 = &p1
	fmt.Println(pp1)
	fmt.Printf("%p,%T\n", pp1, pp1)

	// 访问属性
	pp1.name = "王五"
	fmt.Println(pp1)
	fmt.Println(p1)

	// 3. 使用new()函数
	pp2 := new(Person)
	fmt.Printf("%p,%T\n", pp2, pp2)

}
